#ifndef ADAPTATIVE_THRESHOLD_OPERATOR_HPP
#define ADAPTATIVE_THRESHOLD_OPERATOR_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------
#include "Region.hpp"
#include "Operator.hpp"
#include "GrayImage.hpp"
#include "BinaryImage.hpp"
#include "ThresholdFinder.hpp"

namespace ImageAnalysis
{

//----------------------------------------------------------------------
// Cette classe permet l'utilisation d'une méthode de seuillage en adaptatif.
// C'est à dire que pour une méthode de détection de seuil, on va l'appliquer
// dans des fenêtres de tailles variables, en fonction des seuils trouvés.
// On pourra ainsi retourner une image seuillée, c'est à dire binarisée.
//----------------------------------------------------------------------
class AdaptativeThresholdOperator : public Operator
{
public:
		//----------------------------------------------------------------------
		// Structure
		//----------------------------------------------------------------------
		
		//----------------------------------------------------------------------
		// Constructeur
		//----------------------------------------------------------------------
		AdaptativeThresholdOperator( Gradiant* gradiant, BinaryImage* thresholdedImage, ThresholdFinder* finder );
		
		//----------------------------------------------------------------------
		// Destructeur
		//----------------------------------------------------------------------
		virtual ~AdaptativeThresholdOperator();
		
		//----------------------------------------------------------------------
		// Méthode contenant l'algorithme de seuillage adaptatif
		//----------------------------------------------------------------------
		virtual void Process( );
	
private:
		//----------------------------------------------------------------------
		//
		//----------------------------------------------------------------------
		Gradiant* currentGradiant;
		BinaryImage* currentThresholdedImage;				
		ThresholdFinder* thresholdFinder;
		unsigned char thresholdEpsilon;
		
		//----------------------------------------------------------------------
		// Méthode permettant de subdiviser récursivement l'image en fenêtres
		//----------------------------------------------------------------------
		void RecursiveSubdividing( Region& region, unsigned char parentThreshold );
		
		//----------------------------------------------------------------------
		// Constructeur par copie et oprérateur d'affectation en privée pour
		// interdire leur utilisation
		//----------------------------------------------------------------------
		AdaptativeThresholdOperator( const AdaptativeThresholdOperator& copy);
		AdaptativeThresholdOperator& operator=( const AdaptativeThresholdOperator& copy );
};

}

#endif //ADAPTATIVE_THRESHOLD_OPERATOR_HPP
